package br.com.scaffold.fipform.controllers;

import java.util.List;

import javax.servlet.http.HttpSession;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.scaffold.fipform.models.Usuario;
import br.com.scaffold.fipform.repositories.UsuarioRepositorio;
import br.com.scaffold.fipform.util.Autorizacao;
import br.com.scaffold.fipform.util.EmailValidator;
import br.com.scaffold.fipform.util.Permissao;

@Resource
public class UsuarioController {

	private final UsuarioRepositorio userRep;
	private final Result result;
	private final Validator validator;

	public UsuarioController(UsuarioRepositorio rep, Result result,
			Validator validator) {
		this.userRep = rep;
		this.result = result;
		this.validator = validator;
	}
	
	@Path("/cadastro")
	public void formulario() {
	}
	
	@Get("/recuperar")
	public void recuperar() {
		
	}
	
	@Autorizacao({Permissao.Administrador})
	public List<Usuario> listar() {
		return this.userRep.listAll();
	}
	
	public void salvar(Usuario usuario) {
		validarFormulario(usuario);
		validator.onErrorRedirectTo(this).formulario();
		usuario.setPermissao("Anonimo");
		usuario.setPreencheu(false);
		userRep.save(usuario);
		result.include("sucesso", "Cadastro efetuado com sucesso").redirectTo(LoginController.class).login();
	}

	@Autorizacao({Permissao.Administrador})
	public void atualizar(Usuario usuario) {
		this.userRep.update(usuario);
		result.redirectTo(this).listar();
	}
	
	@Autorizacao({Permissao.Administrador})
	@Get("/usuario/editar/{id}")
	public Usuario editar(Long id) {
		return userRep.load(id);
	}
	
	@Autorizacao({Permissao.Administrador})
	@Get("/usuario/visualizar/{id}")
	public Usuario visualizar(Long id) {
		return this.userRep.load(id);
	}
    
    private void validarFormulario(final Usuario usuario) {
    	if(usuario.getLogin() == null || usuario.getLogin().isEmpty())
    		validator.add(new ValidationMessage("Login em branco", ""));
    	if(usuario.getLogin() == null ||usuario.getLogin().length() <= 4)
    		validator.add(new ValidationMessage("Login precisa ter mais que 4 caracteres", ""));
    	if(usuario.getLogin() != null)
    		usuario.setLogin(usuario.getLogin().trim().toLowerCase());
    	if(usuario.getLogin() != null && usuario.getLogin().contains(" "))
    		validator.add(new ValidationMessage("Nao pode ter espaço no login", ""));
    	if(usuario.getLogin() != null && userRep.isLoginExiste(usuario.getLogin()))
    		validator.add(new ValidationMessage("Login já existe", ""));
    	if(usuario.getSenha() != null && usuario.getSenha().length() <= 4)
    		validator.add(new ValidationMessage("Senha precisa ter mais que 4 caracteres.", ""));
		if(usuario.getEmail() == null)
			validator.add(new ValidationMessage("Email não pode ser nulo", ""));
		if(usuario.getEmail() != null && !EmailValidator.validate(usuario.getEmail()))
			validator.add(new ValidationMessage("Email inválido, coloque um email válido", ""));
	}

}
